/**
 * jquery.jsonengine.js test.
 */
describe('jquery.jsonengine.jsは', function() {

	var elements;
	var waitTime = 500;

	// テストデータの作成
	var createTestElements = function() {
		var body = $('body');
		// element1
		var e1 = $('<div class="dummyclass _je_messages dummyclass2">');
		body.append(e1);
		// element2
		var e2 = $('<div class="_je_messages">');
		e2.append($('<span class="query">')
			.append('?cond=messageBody_.eq.本日は晴天なり'));
		body.append(e2);
		// element3
		var e3 = $('<div class="_je_messages">');
		e3.append($('<span class="query">')
			.append('?sort=_createdAt.desc'));
		body.append(e3);
	};

	beforeEach(function() {
		createTestElements();
		elements = $('*[class*=_je_]');
	});

	afterEach(function() {
		$('*[class*=_je_]').remove();
	});

	// テスト定義 =============================================

	it('命名規則でURLを構築出来る', function() {
		expect(elements.eq(0)._URL()).toEqual('/_je/messages');
		expect(elements.eq(1)._URL()).toEqual('/_je/messages?cond=messageBody_.eq.本日は晴天なり');
		expect(elements.eq(2)._URL()).toEqual('/_je/messages?sort=_createdAt.desc');
	});

	it('データを読み込み表示出来る', function() {
		runs(function() {
			elements.eq(0)._LOAD();
		});
		waits(waitTime);
		runs(function() {
			expect(elements.eq(0).find('.success').get(0)).toBeDefined();
		});
	});

	it('問い合せたデータが存在しなかったら何も表示されない。', function() {
		runs(function() {
			$('*[class*=_je_]').remove();
			var e1 = $('<div class="dummyclass _je_emptyData dummyclass2">');
			$('body').append(e1);
			elements = $('*[class*=_je_]');
			elements.eq(0)._LOAD();
		});
		waits(waitTime);
		runs(function() {
			expect(elements.eq(0).find('.success').get(0)).toBeUndefined();
		});
	});

	it('読み込みででエラーが発生した場合はエラー処理が実行される', function() {
		// berofeDo
		runs(function() {
			$.jsonengine.fn.ajax = function(option) {
				setTimeout(function() {
					return;
				}, 100);
				option.error(null, 'error');
			};
		});

		// Do
		runs(function() {
			elements.eq(0)._LOAD();
		});
		waits(waitTime);
		runs(function() {
			expect(elements.eq(0).find('.error').get(0)).toBeDefined();
		});

		runs(function() {
			elements.eq(1)._LOAD();
		});
		waits(waitTime);
		runs(function() {
			expect(elements.eq(1).find('.error').get(0)).toBeDefined();
		});

		runs(function() {
			elements.eq(2)._LOAD();
		});
		waits(waitTime);
		runs(function() {
			expect(elements.eq(2).find('.error').get(0)).toBeDefined();
		});

		// afterDo
		runs(function() {
			$.jsonengine.fn.ajax = function(option) {
				$.ajax(option);
			};
		});
	});

});
